\documentclass[a4paper,12pt]{article}

\input{header.tex}

\title{Метрики объектно ориентированных программных систем. Тестирование приложений.}
\author{Чигорин А.А. ИУ7-102}

\begin{document}
\maketitle

\section{Метрики объектно ориентированных программных систем}
\subsection{Метрики инкапсуляции}
Метрики инкапсуляции были посчитаны для класса RequestManager, основной задачей которого является обработка входящих сообщений. Таблица \ref{table:incapsulation_metrics} показывает метрики инкапсуляции.

\begin{table}[h]
\begin{tabular*}{0.75\textwidth}{@{\extracolsep{\fill}} | l | l |}
\hline
Название метрики 	& Значение  \\	
\hline
Недостаток связности в методах LCOM	& 0\\
\hline
Процент публичных  и защищенных PAP & 0 \\
\hline
Публичный доступ к компонентным & 0 \\
данным PAD & \\
\hline
\end{tabular*}
\caption{Метрики инкапсуляции.}
\label{table:incapsulation_metrics}
\end{table}

\subsection{Метрики наследования}
Метрика, показывающая количество детей класса измерялась для класса UniMessage, который представляет из общее описание сообщения. От него наследуют сообщения различных форматов (JSON, XML).
Таблица \ref{table:inherit_metrics} показывает метрики наследования.
\begin{table}[h]
\begin{tabular*}{0.75\textwidth}{@{\extracolsep{\fill}} | l | l |}
\hline
Название метрики 	& Значение  \\	
\hline
Количество корневых классов NOR & 4\\
\hline
Высота дерева наследования DIT & 2\\
\hline
Количество детей NOC & 2\\
\hline
\end{tabular*}
\caption{Метрики наследования.}
\label{table:inherit_metrics}
\end{table}

\subsection{Метрики полиморфизма}
Фактор полиморфизма был измерен для класса UniMessage, который представляет из себя корень дерева наследования, таким образом для этого класса данная метрика будет высокой.
Таблица \ref{table:poly_metrics} показывает метрики полиморфизма.
\begin{table}[h]
\begin{tabular*}{0.7\textwidth}{@{\extracolsep{\fill}} | l | l |}
\hline
Название метрики 	& Значение\\	
\hline
Фактор полиморфизма POF & 0.66\\
\hline
\end{tabular*}
\caption{Метрики наследования.}
\label{table:poly_metrics}
\end{table}

\section{Тестирование приложений}
\subsection{Модельное тестирование}
\textbf{Модульное тестирование} – это тестирование классов  (по принципу белого ящика), используя написание тестовых драйверов для проверки функциональности, входящих в класс методов.

Целью выполнения данного типа тестов является проверка цепочек вызовов методов. Тест считался пройденным, если после его выполнения автомат оказывался в верном состоянии.

Проведено модульное тестирование класса Automat, описывающего интерфейс к автомату, описывающему жизненный цикл заявки системы заказчика. Тестирование проводится при помощи средства автоматического тестирования JUNIT.

Таблица \ref{table:module_tests} описывает проведенное модульное тестирование.

\begin{table}[h]
\begin{tabular*}{1.1\textwidth}{@{\extracolsep{\fill}} | l | l | l | l |}
\hline
ID-теста 	& Описание теста 	& Ожидаемые  	& Реальные  \\	
			&					& результаты	& результаты \\
\hline
M-1 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& методов  								& состояние Done 		& состояние Done. \\
	& ack\_Seller\_1\_Message				&						& Тест пройден \\
	& ack\_PayingSystem\_1\_Message			& & \\
	& ack\_User\_1\_Message					& & \\
	& ack\_Seller\_2\_Message				& & \\
\hline
M-2 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& методов  								& состояние Cancel 		& состояние Cancel. \\
	& ack\_Seller\_1\_Message				&						& Тест пройден \\
	& ack\_PayingSystem\_1\_Message			& & \\
	& ack\_User\_1\_Message					& & \\
\hline
M-3 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& методов  								& состояние Cancel 		& состояние Cancel. \\
	& ack\_Seller\_1\_Message				&						& Тест пройден \\
	& ack\_PayingSystem\_1\_Message			& & \\
	& nack\_User\_1\_Message				& & \\
\hline
M-4 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& методов с таймаутом 					& состояние Cancel 		& состояние Cancel \\
	& ack\_Seller\_1\_Message				& по таймауту			& по таймауту. \\
	& ack\_PayingSystem\_1\_Message			& 						& Тест пройден \\
	& не вызывать метод время 				& & \\
	& большее timeout\_Ack\_User			& & \\
\hline
\end{tabular*}
\caption{Модульное тестирование.}
\label{table:module_tests}
\end{table}

Код автоматичеких тестов приведен в Приложении 1.

\textbf{Результат работы автоматических тестов:}
\input{../include/test/automat/result.test.tex}

\subsection{Интеграционное тестирование}
\textbf{Интеграционное тестирование} – тестирование по принципу белого ящика правильности взаимодействия классов, входящих в различные модули.

Целью выполнения данного типа тестов является проверка правильности взаимодействия класса Automat и класса RequestManager, котороый получает сообщения от других систем по электронной почте, обрабатывает их, и посылает сообщения на вход автомата какой-либо из заявок. Автомат, описывающий жизненный цикл заявки, приведен на рис. \ref{fig:automat}.

\begin{figure}
\centering
\includegraphics[scale = 0.36]{../include/sys/fsm/graph/Automat_sm_dia_eps.pdf}
\caption{Автомат, описывающий жизненный цикл заявки.}
\label{fig:automat}
\end{figure} 

Таблица \ref{table:integral_tests} описывает проведенное модульное тестирование.

\begin{table}[h]
\begin{tabular*}{1.1\textwidth}{@{\extracolsep{\fill}} | l | l | l | l |}
\hline
ID-теста 	& Описание теста 	& Ожидаемые  	& Реальные  \\	
			&					& результаты	& результаты \\
\hline
M-1 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& сообщений  							& состояние Done 		& состояние Done. \\
	& ack\_Seller\_1\_Message				&						& Тест пройден \\
	& ack\_PayingSystem\_1\_Message			& & \\
	& ack\_User\_1\_Message					& & \\
	& ack\_Seller\_2\_Message				& & \\
\hline
M-2 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& сообщений  							& состояние Cancel 		& состояние Cancel. \\
	& ack\_Seller\_1\_Message				&						& Тест пройден \\
	& ack\_PayingSystem\_1\_Message			& & \\
	& ack\_User\_1\_Message					& & \\
\hline
M-3 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& сообщений  							& состояние Cancel 		& состояние Cancel. \\
	& ack\_Seller\_1\_Message				&						& Тест пройден \\
	& ack\_PayingSystem\_1\_Message			& & \\
	& nack\_User\_1\_Message				& & \\
\hline
M-4 & Тестируется последовательность 		& Автомат пришел в 		& Автомат пришел в \\
	& сообщений с таймаутом 				& состояние Cancel 		& состояние Cancel \\
	& ack\_Seller\_1\_Message				& по таймауту			& по таймауту. \\
	& ack\_PayingSystem\_1\_Message			& 						& Тест пройден \\
	& не посылать сообщения время			& & \\
	& большее timeout\_Ack\_User			& & \\
\hline
\end{tabular*}
\caption{Интеграционное тестирование.}
\label{table:integral_tests}
\end{table}

Созданы автоматические тесты с использованием системы JUNIT. Код тестов приведен в приложении 2.

\textbf{Результат работы автоматических тестов:}
\input{../include/test/logic/result.test.tex}

\subsection{Системное тестирование}
\textbf{Системное тестирование} - тестирование по принципу черного ящика правильности функционирования системы в целом.

Целью выполнения данного типа тестов является проверка соответствия программы заявленной функциональности и устойчивость к неправильному вводу.

Тестирование заявленной функциональности производится в соответствии с интерфейсом пользователя, который в данном проекте представляет из себя интерфейс командной строки. Таблица \ref{table:functional} отражает результаты тестирования.

\begin{table}[t]
\begin{tabular*}{1.1\textwidth}{@{\extracolsep{\fill}} | l | l | l | l |}
\hline
ID-теста 	& Описание теста 	& Ожидаемые  	& Реальные  \\	
			&					& результаты	& результаты \\
\hline
F-1 & Добавление заявки		 				& Заявка успешно  		& Заявка успешно \\
	& 		  								& добавлена в систему	& добавлена. 	\\
	& 										& заказчика				& Тест пройден. \\
\hline
F-2 & Отмена заявки 						& Заявка успешно 		& Заявка успешно \\
	&   									& отменена в системе	& отменена. \\
	&										& заказчика и поставщика& Тест пройден. \\
\hline
F-3 & Подтверждение заявки 					& Заявка подтверждена 	& Заявка успешно \\
	& 			  							& в системе				& отменена. \\
	& 										& заказчика 			& Тест пройден. \\
\hline
F-4 & Просмотр заявок 						& Пользователю выведен 	& Выведен список \\
	& 			 							& список заявок в		& заявко пользователя\\
	& 										& системе	 			& Тест пройден. \\
\hline
F-5 & Оплатить заявку 						& Заявка оплачена 		& Заявка оплачена \\
	& 			 							& в системе оплаты		& в системе оплаты. \\
	& 										& 			 			& Тест пройден. \\
\hline
\end{tabular*}
\caption{Тестирование заявленной функциональности.}
\label{table:functional}
\end{table}

Тестирование устойчивости к неправильному вводу производится на основе интерфейса пользователя системы на основе: 
\begin{itemize}
\item Сопоставления с маской, которая описана за счет регулярных выражений
\item Проверкой на попадание значения в границы интервала
\item Проверки заполненности обязательных болей
\end{itemize}
Результаты тестирования приведены в таблице \ref{table:input}.
\begin{table}[hp]
\begin{tabular*}{1.1\textwidth}{@{\extracolsep{\fill}} | l | l | l | l |}
\hline
ID-теста & Описание теста & Ожидаемые  & Реальные  \\	
		 &			      & результаты & результаты \\
\hline
I-1 & Ввод неверных данных	& Адрес сервера & Адрес сервера \\
	& в поле адреса сервера	& не принят.	& не принят. 	\\
	& сообщений				& 				& Тест пройден. \\
	&						&				& Выдано сообщение \\
	&						&				& <<Неверный адрес  \\
	&						&				& сервера>> \\
\hline
I-2 & Ввод неверных данных	& Адрес 		& Адрес \\
	& в поле адреса системы	& не принят.	& не принят. 	\\
	& заказчика				& 				& Тест пройден. \\
	&						&				& Выдано сообщение \\
	&						&				& <<Неверный адрес  \\
	&						&				& заказчика>> \\
\hline
I-3 & Ввод некорректного	& Имя пользователя 	& Имя пользователя \\
	& имеени пользователя	& не принято.		& не принято. 	\\
	& 						& 					& Тест пройден. \\
	&						&					& Выдано сообщение \\
	&						&					& <<Неверное имя  \\
	&						&					& пользователя>> \\
\hline
I-4 & Ввод имени			& Имя пользователя 	& Имя пользователя \\
	& пользователя,			& не принято.		& не принято. 	\\
	& отстутствующего в		& 					& Тест пройден. \\
	& в базе данных			&					& Выдано сообщение \\
	&						&					& <<Неизвестный  \\
	&						&					& пользователь>> \\
\hline
I-5 & Ввод большого			& Заказ не принят. 	& Заказа не принят \\
	& количества			& 					& Тест пройден. 	\\
	& заказываемого 		& 					& Выдано сообщение \\
	& товара				&					& <<Нельзя заказать \\
	&						&					& так много товара>>  \\
\hline
I-6 & Заполнены не все		& Заказ не принят. 	& Заказа не принят \\
	& обязательные поля		& 					& Тест пройден. 	\\
	&  						& 					& Выдано сообщение \\
	& 						&					& <<Заполнены не все \\
	&						&					& обязательные поля>>  \\
\hline
I-7 & Заполнены не все		& Используется	 	& Заказ принят. \\
	& необязательные поля	& значение 			& Тест пройден. 	\\
	&  						& по-умолчанию		& \\
\hline
\end{tabular*}
\caption{Тестирование устойчивости к неправильному вводу.}
\label{table:input}
\end{table}

\section{Приложение 1}
\textbf{Код автоматических тестов:}
\input{../include/test/automat/AutomatTest.java.tex}

\section{Приложение 2}
\textbf{Код автоматических тестов:}
\input{../include/test/logic/LogicTest.java.tex}

\end{document}
